saewoo
githubemail
2024-8-23

πŸ“– [νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²Œ] μ±… 제λͺ© μ΄ν•΄ν•˜κΈ°

νƒ€μž…μŠ€ν¬λ¦½νŠΈ κ΄€μ μœΌλ‘œ 이해해 보자!

νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²Œ μ±… ν‘œμ§€
좜처: YES24

졜근 μ΄μ„ ν˜‘λ‹˜μ΄ μž‘μ„±ν•˜μ‹  Type-Driven-Development ν¬μŠ€νŒ…μ„ μ½μ—ˆμŠ΅λ‹ˆλ‹€.

ν₯λ―Έλ‘œμ› κ³  ν˜ΈκΈ°μ‹¬μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λŒ“κΈ€μ„ λ‚¨κ²ΌμŠ΅λ‹ˆλ‹€. μž‘μ„±ν•˜μ‹  λ‚΄μš©μ„ ν•™μŠ΅ν•˜κΈ° μœ„ν•΄μ„  무엇을 ν•™μŠ΅ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œμš”.

νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²ŒλΌλŠ” 책을 μΆ”μ²œν•΄μ£Όμ…¨κ³ , λ°”λ‘œ κ΅¬λ§€ν•΄μ„œ λ‹€μŒλ‚ λΆ€ν„° μ½μ—ˆμŠ΅λ‹ˆλ‹€.


이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 책을 읽고 μ±… 제λͺ©μ˜ 의미λ₯Ό μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

μ±…μ—μ„œλŠ” νŠΉμ • μ–Έμ–΄ 기반 μ„€λͺ…이 μ•„λ‹Œ, λ‹€μ–‘ν•œ μ–Έμ–΄μ˜ μ˜ˆμ‹œλ₯Ό 톡해 μ„€λͺ…을 μ œκ³΅ν•˜μ§€λ§Œ

μ €λŠ” μ΅μˆ™ν•œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ μ •λ¦¬ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.


μ±… λ‚΄μš© 이외에도 μž‰μ—¬ 속성 검사와 νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ‹€νλ©˜ν„°λ¦¬μ—μ„œ λ³Έ ν₯미둜운 λ‚΄μš©μ„ 일뢀 λ‹΄μ•˜μŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„λ„ ν₯λ―Έλ‘œμ› μœΌλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€. :)

λͺ©μ°¨

νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ

νƒ€μž…μ€ 정적 νƒ€μž… μ–Έμ–΄λ₯Ό μ‚¬μš©ν•΄λ³Έ 뢄듀이라면 λˆ„κ΅¬λ‚˜ κ²½ν—˜μƒ 어떀것인지 감이 μ˜€μ‹€κ²λ‹ˆλ‹€.

κ·Έλ ‡λ‹€ ν•˜λ”λΌλ„ νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œ λΌλŠ” μ˜λ―ΈλŠ” μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄μ„œ νƒ€μž…μ— λŒ€ν•œ μ •μ˜λΆ€ν„° μ‹œμž‘ν•˜λŠ”κ²Œ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€.

νƒ€μž…μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

νƒ€μž…μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

μ €μžκ°€ μ΄μ•ΌκΈ°ν•œλ°”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


값이 가진 λŠ₯λ ₯에 따라 λΆ„λ₯˜ ν•œ 것. 

λŠ₯λ ₯μ΄λž€ 말이 μΆ”μƒμ μœΌλ‘œ 느껴질 수 μžˆμ„κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.

ꡬ체적인 μ˜ˆμ‹œλ₯Ό 톡해 이해해 λ³΄κ² μŠ΅λ‹ˆλ‹€.


λ¬ΈμžλŠ” μ–΄λ–€ λŠ₯λ ₯을 κ°€μ§ˆκΉŒμš”?

'abc'λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ„ 톡해 μƒμ„±ν•œ λ¬Έμžμž…λ‹ˆλ‹€.

λ¬ΈμžλŠ” ν”„λ‘œν† νƒ€μž… 상속(μ°Έμ‘°)을 톡해 'at', 'substring', 'match' λ“±μ˜ λŠ₯λ ₯을 κ°–μŠ΅λ‹ˆλ‹€.


배열은 μ–΄λ–€ λŠ₯λ ₯을 κ°€μ§ˆκΉŒμš”?

[1,2,3]λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μ„ 톡해 μƒμ„±ν•œ λ°°μ—΄μž…λ‹ˆλ‹€.

배열은 ν”„λ‘œν† νƒ€μž… 상속(μ°Έμ‘°)을 톡해 'map', 'filter', 'reduce' λ“±μ˜ λŠ₯λ ₯을 κ°–μŠ΅λ‹ˆλ‹€.


ν•˜μ§€λ§Œ 값이 가진 λŠ₯λ ₯에 λ²—μ–΄λ‚œ 일을 μ‹œν‚€λ©΄ νƒ€μž… 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.


'abc'.filter() // type error
[1,2,3].substring() // type error

μ •λ¦¬ν•˜μžλ©΄ νƒ€μž…μ€ κ°’μ˜ λŠ₯λ ₯이고, λŠ₯λ ₯에 λ²—μ–΄λ‚œ 일을 μ‹œν‚€λ©΄ νƒ€μž… 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

νƒ€μž…μœΌλ‘œ κ²¬κ³ ν•˜κ²Œλž€ λ¬΄μ—‡μΌκΉŒ?

λ²„κ·Έμ˜ λŒ€λ‹€μˆ˜λŠ” νƒ€μž… 였λ₯˜μž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ νƒ€μž… 였λ₯˜λ₯Ό μ΅œλŒ€ν•œ μ€„μ΄λŠ”κ²ƒμ΄ μ€‘μš”ν•˜κ² μŠ΅λ‹ˆλ‹€.

AirbnbλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ„μž…μœΌλ‘œ λ²„κ·Έμ˜ 38%λ₯Ό μ˜ˆλ°©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.


μ—μ–΄λΉ„μ•€λΉ„μ˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ„μž…μœΌλ‘œ 버그λ₯Ό 쀄인 사둀 μŠ€ν¬λ¦°μƒ·
좜처: JS Conf 11λΆ„ 54초

μ–΄λ–»κ²Œ νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ„μž…λ§ŒμœΌλ‘œ 버그λ₯Ό μ€„μΌμˆ˜ μžˆμ—ˆλ˜ κ²ƒμΌκΉŒμš”?

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” νƒ€μž… 검사기λ₯Ό 톡해 μš°λ¦¬κ°€ μž‘μ„±ν•œ μ†ŒμŠ€μ½”λ“œμ— κ°’μ˜ λŠ₯λ ₯에 λ²—μ–΄λ‚œ μ‚¬μš©μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜μ—¬,

κ°’μ˜ λŠ₯λ ₯에 λ²—μ–΄λ‚œ 일을 μ‹œμΌ°λ‹€λ©΄ μ»΄νŒŒμΌμ„ κ±°λΆ€ ν•©λ‹ˆλ‹€.


정적 νƒ€μž… 언어인 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ™€ 동적 νƒ€μž… 언어인 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λΉ„κ΅ν•΄μ„œ 예λ₯Όλ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±λœ μ½”λ“œλŠ” νƒ€μž… μ—λŸ¬κ°€ λŸ°νƒ€μž„μ—μ„œ λ°œμƒν•˜λŠ” 반면,

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±λœ μ½”λ“œλŠ” νƒ€μž… μ—λŸ¬λ₯Ό μ»΄νŒŒμΌμ‹œ(컴파일 μ˜΅μ…˜μ„ 톡해 선택할 수 μžˆκΈ°λŠ” ν•©λ‹ˆλ‹€) λ°œκ²¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


즉 정적 νƒ€μž… 언어인 νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ νƒ€μž… 였λ₯˜λ₯Ό 컴파일 λ‹¨κ³„μ—μ„œ 미리 λ°œκ²¬ν•˜κ³  μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이둜 인해 λŸ°νƒ€μž„μ—μ„œ λ°œμƒν•  수 μžˆλŠ” νƒ€μž… κ΄€λ ¨ 였λ₯˜λ₯Ό 사전에 방지할 수 μžˆκ²Œλ˜μ–΄,

결과적으둜 더 κ²¬κ³ ν•œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 탄생 λ°°κ²½

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 둜고
좜처: https://devblogs.microsoft.com/typescript/

2010λ…„ μ¦ˆμŒμ— κΈ°λ³Έ λΈŒλΌμš°μ €λ₯Ό 인터넷 μ΅μŠ€ν”Œλ‘œμ–΄μ—μ„œ 크둬으둜 λ³€κ²½ν–ˆλ˜ 기얡이 λ‚©λ‹ˆλ‹€.

λ‹Ήμ‹œ 인터넷 μ΅μŠ€ν”Œλ‘œμ–΄λŠ” μ›Ή μ‚¬μ΄νŠΈκ°€ λœ¨κΈ°κΉŒμ§€ 수 초λ₯Ό κΈ°λ‹€λ €μ•Ό ν–ˆλŠ”λ°, 크둬은 그에 λΉ„ν•΄ μ•„μ£Ό λΉ λ¦ΏλΉ λ¦Ών–ˆμŠ΅λ‹ˆλ‹€.

크둬은 v8 μ—”μ§„μœΌλ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ 속도 κ°œμ„ μ„ ν¬ν•¨ν•œ μ „λ°˜μ μΈ μ•„ν‚€ν…μ²˜ κ°œμ„ μœΌλ‘œ 이λ₯Ό κ°€λŠ₯μΌ€ ν–ˆμŠ΅λ‹ˆλ‹€.


λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ λΉ λ₯Έ 속도 덕뢄에 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±λœ 더 큰 μ†Œν”„νŠΈμ›¨μ–΄μΈ vscodeλ₯Ό λ§Œλ“€κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

그런데 μ•½ 7천 μ€„μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

버그λ₯Ό μ°ΎλŠ” 데 ν•œλ‚˜μ ˆμ΄ κ±Έλ¦¬λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

νƒ€μž… 정보가 없기에 λŸ°νƒ€μž„μ—μ„œ 버그λ₯Ό μ°Ύμ•„μ•Ό ν–ˆκ³  디버거에 μ˜μ‘΄ν•΄μ•Όλ§Œ ν–ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λŸ°νƒ€μž„μ΄ μ•„λ‹Œ 컴파일 λ‹¨κ³„μ—μ„œ 버그λ₯Ό 찾을 수 μžˆλ„λ‘ 정적 νƒ€μž… 언어인 νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό κ°œλ°œν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²Œ

μ±…μ—μ„œλŠ” 'λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•˜κ²Œ'λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ λ‹€μŒ μ±•ν„°λ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.


- μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„± 
- λ§€κ°œλ³€μˆ˜μ— μ˜ν•œ λ‹€ν˜•μ„±
- 두 λ‹€ν˜•μ„±μ˜ λ§Œλ‚¨
- μ˜€λ²„λ‘œλ”©μ— μ˜ν•œ λ‹€ν˜•μ„±

ν•΄λ‹Ή ν¬μŠ€νŒ…μ—μ„œλŠ” κ°€μž₯ 기본적인 μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±μ„ 이야기 ν•˜κ³ μž ν•©λ‹ˆλ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€ν˜•μ„±μ˜ μ •μ˜λΆ€ν„° μ‹œμž‘ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ‹€ν˜•μ„±μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

λ‹€ν˜•μ„±μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

μ €μžλŠ” λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•©λ‹ˆλ‹€.


ν•œ κ°œμ²΄κ°€ μ—¬λŸ¬ νƒ€μž…μ— μ†ν•˜λŠ” 것.

ν•œ κ°œμ²΄κ°€ μ—¬λŸ¬ νƒ€μž…μ— μ†ν•˜κΈ° μœ„ν•΄μ„œ 정적 νƒ€μž… μ–Έμ–΄κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯쀑 ν•˜λ‚˜κ°€ μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±μž…λ‹ˆλ‹€.

μƒˆλ‘œμš΄ μš©μ–΄κ°€ λ‚˜μ™”λ„€μš”.

κ³„μ†ν•΄μ„œ μ„œλΈŒνƒ€μž…μ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ„œλΈŒνƒ€μž…μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

μ„œλΈŒνƒ€μž…μ€ λ¬΄μ—‡μΌκΉŒμš”?

μ €μžλŠ” λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•©λ‹ˆλ‹€.

μ„œλΈŒνƒ€μž…μ€ 'AλŠ” B이닀'의 관계λ₯Ό λ§Œμ‘±ν•˜λŠ”κ²ƒμ„ λœ»ν•©λ‹ˆλ‹€.

'학생은 μ‚¬λžŒμ΄λ‹€.'λΌλŠ” λ¬Έμž₯은 'AλŠ” B이닀.' 관계λ₯Ό λ§Œμ‘±ν•˜λ―€λ‘œ

'학생은 μ‚¬λžŒμ˜ μ„œλΈŒνƒ€μž…μ΄λ‹€.' 둜 바꿔말할 수 μžˆμŠ΅λ‹ˆλ‹€.


μ±…μ—μ„œλŠ” 식당을 μ˜ˆμ‹œλ‘œ λ“­λ‹ˆλ‹€.

식당은 μ‚¬λžŒμ΄ μž…μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 학생도 μ‚¬λžŒμ΄λ―€λ‘œ 식당에 μž…μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ ν•™μƒλ§Œ μž…μž₯ν•  수 μžˆλŠ” 식당은 μ‚¬λžŒμ€ μž…μž₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  μ‚¬λžŒμ€ 학생이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄μ£ .

μ„œλΈŒνƒ€μž… 관계λ₯Ό νƒ€μž… 검사기에 μ•Œλ¦¬λŠ” extends ν‚€μ›Œλ“œ

μ•žμ„  '학생은 μ‚¬λžŒμ΄λ‹€.'μ—μ„œ 'AλŠ” B이닀.'의 κ΄€κ³„λŠ” μ‚¬λžŒμ—κ²ŒλŠ” μ§κ΄€μ μ΄μ§€λ§Œ, νƒ€μž… 검사기 μž…μž₯μ—μ„œλŠ” μ•„λ‹™λ‹ˆλ‹€.

식당에 μ‚¬λžŒμ„ μž…μž₯μ‹œν‚€λŠ” ν•¨μˆ˜λ₯Ό μ˜ˆμ‹œλ‘œ λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.


class Person {
  name: string
  
  constructor(name: string) {
    this.name = name
  }
}
class Student {
  name: string;

  constructor(name: string) {
    this.name = name
  }
}

const person = new Person('Kim')
const student = new Student('Park')

const enterRestaurant = (p: Person) => {}

enterRestaurant(person) // ok
enterRestaurant(student) // error

Person의 μΈμŠ€ν„΄μŠ€μΈ personκ³Ό Student의 μΈμŠ€ν„΄μŠ€μΈ studentλ₯Ό enterRestaurant ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬μ‹œ νƒ€μž… 검사λ₯Ό 톡과 ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ™œλƒν•˜λ©΄ μ§κ΄€μ μœΌλ‘œ 학생은 μ‚¬λžŒμ΄κΈ° λ•Œλ¬Έμ΄μ£ .


ν•˜μ§€λ§Œ 이것은 우리의 직관일 뿐, νƒ€μž… 검사λ₯Ό ν†΅κ³Όν•˜κΈ° μœ„ν•΄μ„  νƒ€μž… 검사기에 두 클래슀의 관계λ₯Ό μ•Œλ €μ•Όν•©λ‹ˆλ‹€.


class Person {}
class Student extends Person {}

extends ν‚€μ›Œλ“œλ₯Ό 톡해 λ‘˜μ€ μ„œλΈŒνƒ€μž… κ΄€κ³„μž„μ„ λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이제 νƒ€μž… κ²€μ‚¬κΈ°λŠ” 학생과 μ‚¬λžŒμ˜ 관계λ₯Ό μ΄ν•΄ν•˜μ—¬ 우리의 직관과 λ™μΌν•˜κ²Œ ν• λ‹Ή μ—¬λΆ€λ₯Ό νŒλ‹¨ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


μ—¬κΈ°κΉŒμ§€ μ½μ—ˆλ‹€λ©΄, λ­”κ°€ μ˜μ•„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œ νƒ€μž… κ²€μ‚¬κΈ°λŠ” νƒ€μž… 였λ₯˜λ₯Ό 내지 μ•Šκ³ , μœ„μ˜ μ½”λ“œλ₯Ό ν†΅κ³Όμ‹œν‚€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.


enterRestaurant(person) // ok
enterRestaurant(student) // ok

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ μ„œλΈŒνƒ€μž… 관계λ₯Ό μΆ”λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ™μž‘μ€ ꡬ쑰적 타이핑이라고 ν•©λ‹ˆλ‹€.

μ„œλΈŒνƒ€μž…κ³Ό λ‹€ν˜•μ„±μ— λŒ€ν•΄ μ•Œμ•„λ΄€μœΌλ―€λ‘œ μš°μ„  μ±…μ˜ 제λͺ©μΈ μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±μ— λŒ€ν•œ 의미λ₯Ό 짚고 λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

μ•žμ—μ„œ μ„œλΈŒνƒ€μž…κ³Ό λ‹€ν˜•μ„±μ˜ 의미λ₯Ό 각각 μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

μ„œλΈŒνƒ€μž…μ€ 'AλŠ” B이닀.'의 관계λ₯Ό λ§Œμ‘±ν•˜κ³ , νƒ€μž… κ²€μ‚¬κΈ°μ—λŠ” 'extends' ν‚€μ›Œλ“œλ‘œ μ•Œλ €μ•Ό ν•œλ‹€κ΅¬μš”.

λ˜ν•œ λ‹€ν˜•μ„±μ΄λž€ 'ν•œ κ°œμ²΄κ°€ μ—¬λŸ¬ νƒ€μž…μ— μ†ν•˜λŠ” 것'μ΄κ΅¬μš”.

κ·Έλ ‡λ‹€λ©΄ μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±μ΄λž€ λ‹€μŒκ³Ό 같이 λ§ν• μˆ˜ μžˆμ„κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.


상속 관계(AλŠ” B이닀 관계)λ₯Ό 톡해 ν•œ 객체가 μ—¬λŸ¬ νƒ€μž…μœΌλ‘œ 취급될 수 있게 ν•˜λŠ” 것.

이λ₯Ό 톡해 μƒμœ„ νƒ€μž…μ„ μš”κ΅¬ν•˜λŠ” 곳에 ν•˜μœ„ νƒ€μž…μ˜ 객체λ₯Ό μ‚¬μš©ν•  수 있게 λ˜μ–΄, μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

유λͺ…ν•œ μ˜ˆμ‹œλ‘œλŠ” JAVAμ—μ„œ List νƒ€μž…μ˜ κ΅¬ν˜„μ²΄λ‘œ ArrayList, LinkedListκ°€ μžˆμ§€λ§Œ,

νƒ€μž… μ§€μ •μ‹œ κ΅¬ν˜„μ΄ μ•„λ‹Œ List νƒ€μž…μœΌλ‘œ ν•œλ‹€λŠ”κ²ƒμ„ μƒκ°ν•΄λ³΄μ‹œλ©΄ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€.

ꡬ쑰적 νƒ€μ΄ν•‘μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

λ‹€μ‹œ λŒμ•„μ™€μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ ꡬ쑰적 타이핑에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

extends둜 상속 관계λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•˜μ§€ μ•Šμ•˜λŠ”λ° ν†΅κ³Όλ˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒμš”?

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž… 검사기가 μ‚¬λžŒμ˜ 직관과 λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” 것이기라도 ν• κΉŒμš”?

이 λ˜ν•œ κ·œμΉ™μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” 상속 관계와 상관 없이 'ꡬ쑰λ₯Ό 톡해 μ„œλΈŒνƒ€μž… 관계λ₯Ό μΆ”λ‘ 'ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ•žμ„œ μ‚΄νŽ΄λ³Έ μ½”λ“œλ₯Ό λ‹€μ‹œ λ³΄κ² μŠ΅λ‹ˆλ‹€.


class Person {
  name: string
  
  constructor(name: string) {
    this.name = name
  }
}
class Student {
  name: string;

  constructor(name: string) {
    this.name = name
  }
}

const person = new Person('Kim')
const student = new Student('Park')

const enterRestaurant = (p: Person) => {}

enterRestaurant(person) // ok
enterRestaurant(student) // error

enterRestaurant ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μ€ Personμž…λ‹ˆλ‹€.

Person의 κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


interface Person {
  name: string
}

Student의 ꡬ쑰 λ˜ν•œ Personκ³Ό λ™μΌν•©λ‹ˆλ‹€.


interface Student {
  name: string
}

Personκ³Ό StudentλŠ” λ™μΌν•œ κ΅¬μ‘°μ΄λ―€λ‘œ νƒ€μž… κ²€μ‚¬κΈ°λŠ” νƒ€μž… 검사λ₯Ό ν†΅κ³Όμ‹œν‚΅λ‹ˆλ‹€.

두 객체λ₯Ό 비ꡐ할 λ•Œ 이름이 어떻냐가 μ€‘μš”ν•œ 것이 μ•„λ‹ˆλΌ ꡬ쑰λ₯Ό μ€‘μš”ν•˜κ²Œ λ³΄λŠ”κ²ƒ

이λ₯Ό ꡬ쑰적 타이핑(structural typing)이라고 ν•©λ‹ˆλ‹€.

extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ 상속 기반의 'μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„±'보닀 μ’€ 더 μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 것이죠.

ν•œνŽΈ ꡬ쑰적 νƒ€μ΄ν•‘μ˜ μ˜ˆμ™Έ 사항이 μ‘΄μž¬ν•˜λŠ”λ°μš”. κ³„μ†ν•΄μ„œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μž‰μ—¬ 속성 κ²€μ‚¬λž€ λ¬΄μ—‡μΌκΉŒ?

μ•žμ„œ νƒ€μž…μ„ κ°’μ˜ λŠ₯λ ₯으둜 μ •μ˜ ν–ˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜μ— νƒ€μž…μ„ μ •μ˜ν•˜λŠ”κ²ƒμ€ μ •μ˜ν•œ νƒ€μž…μ˜ λŠ₯λ ₯λ§Œμ„ ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•˜κ² λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.


const enterRestaurant = (p: Person) => {}

μœ„ ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„°λ‘œ Person을 λ°›κ³  Person νƒ€μž…μ˜ λŠ₯λ ₯λ§Œμ„ μ‚¬μš©ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 좔가적인 λŠ₯λ ₯을 가진 객체λ₯Ό 전달해도 상관 없을것 μž…λ‹ˆλ‹€.


const kim = { name: 'kim', language: 'ko' }

enterRestaurant(kim) // ok

ν•˜μ§€λ§Œ μœ„μ²˜λŸΌ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜κ³  ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ— λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ”κ²ƒμ΄ μ•„λ‹Œ,

객체 λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μœΌλ‘œ 객체λ₯Ό 생성해 νŒŒλΌλ―Έν„°λ‘œ 직접 λ„˜κΈ°λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ νƒ€μž… κ²€μ‚¬κΈ°λŠ” νƒ€μž… μ—λŸ¬λ₯Ό λƒ…λ‹ˆλ‹€.


enterRestaurant({name: 'kim', fly: () => console.log('I can fly')}) // error

λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μœΌλ‘œ 객체λ₯Ό 생성할 경우 μ΄λŠ” μž¬μ‚¬μš© λ˜μ§€ μ•Šκ³ , ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ˜κ²Œ λ©λ‹ˆλ‹€.

ν•¨μˆ˜ λ°–μ—μ„œ ν•΄λ‹Ή 객체λ₯Ό μ°Έμ‘°ν•  이름이 μ—†κΈ° λ•Œλ¬Έμ΄μ£ .

ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ”λ°, 좔가적인 λŠ₯λ ₯을 μ „λ‹¬ν•˜λŠ”κ²ƒμ€ ν•¨μˆ˜κ°€ μΆ”κ°€ λŠ₯λ ₯이 ν•„μš”ν•œ 것 처럼 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 객체 λ¦¬ν„°λŸ΄μ„ 직접 전달할 경우 λ”μš± μ—„κ²©ν•˜κ²Œ κ²€μ‚¬ν•˜μ—¬ νƒ€μž… μ—λŸ¬λ₯Ό 내도둝 μ˜ˆμ™Έμ‚¬ν•­μ„ λ‘μ—ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μž‰μ—¬ 속성 검사라 ν•©λ‹ˆλ‹€.


이에 λŒ€ν•œ 이유λ₯Ό 깊이 있게 μ•Œκ³  μ‹ΆμœΌμ‹  뢄은 TypeScript νƒ€μž… μ‹œμŠ€ν…œ λœ―μ–΄λ³΄κΈ°: νƒ€μž… ν˜Έν™˜μ„±μ„ μ°Έκ³ ν•΄λ³΄μ‹œλ©΄ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€ :)

νƒ€μž…μŠ€ν¬λ¦½νŠΈ 탄생 λ°°κ²½μ—μ„œ μ‚΄νŽ΄λ³Έ ꡬ쑰적 타이핑


νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ‹€νλ©˜ν„°λ¦¬μ—μ„œ ꡬ쑰적타이핑에 λŒ€ν•œ μ€‘μš”μ„±μ— λŒ€ν•œ μŠ€ν¬λ¦°μƒ·
좜처: νƒ€μž…μŠ€ν¬λ¦½νŠΈ λ‹€νλ©˜ν„°λ¦¬ 17λΆ„ 5초

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ 탄생 배경을 μ‚΄νŽ΄λ³΄λ©΄ ꡬ쑰만으둜 μ„œλΈŒνƒ€μž… 관계λ₯Ό μΆ”λ‘ ν•˜κ²Œ 된 이유λ₯Ό μΆ”μΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„μ‹œλ‹€μ‹œν”Ό μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ¨Όμ € λ‚˜μ˜€κ³  2014년도에 νƒ€μž…μŠ€ν¬λ¦½νŠΈ 1 버전이 μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이미 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μˆ˜λ§Žμ€ 객체듀이 μƒμ„±λ˜μ–΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

extends둜 μ„œλΈŒνƒ€μž… 관계λ₯Ό ν‘œν˜„ν•˜κΈ°μ—” μˆ˜λ§Žμ€ νƒ€μž…μ„ μΆ”κ°€λ‘œ μž‘μ„±ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ— ν—ˆλ“€μ΄ 될 수 μžˆλŠ”κ²ƒμ΄μ£ .

λ”°λΌμ„œ ν˜Έν™˜μ„±κ³Ό 점진적 λ„μž…μ„ μœ„ν•΄ ꡬ쑰만 μΌμΉ˜ν•˜λ©΄ 같은 νƒ€μž…μœΌλ‘œ 좔둠될 수 μžˆλ„λ‘ νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μœ μ—°ν•˜κ²Œ μ„€κ³„ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

마무리

μ—¬λŸ¬ λ‹€ν˜•μ„± 쀑 아직은 ν¬μŠ€νŒ…μ—μ„œ μ„€λͺ…ν•œ μ„œλΈŒνƒ€μž…μ— μ˜ν•œ λ‹€ν˜•μ„± μ •λ„λ§Œ λͺ…ν™•νžˆ 이해 ν–ˆλ‹€λŠ” 생각이 λ“­λ‹ˆλ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  책을 읽고 지식이 μ΄˜μ΄˜ν•΄μ§€λŠ” λŠλ‚Œμ΄ μ’‹μ•˜μŠ΅λ‹ˆλ‹€.

더 많이 ν™œμš©ν•΄λ³΄κ³ , μ‹œκ°„μ„ 두어 λ‹€μ‹œ 읽게 λœλ‹€λ©΄ 미처 μ΄ν•΄ν•˜μ§€λͺ»ν•œ 더 λ§Žμ€ λ‹€ν˜•μ„±μ— λŒ€ν•œ 이야기λ₯Ό 이해할 수 μžˆμ„κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.

μΆ”ν›„ μ„±μž₯ν•˜μ—¬ 또 ν•œ 번 읽게 될 날을 κΈ°λŒ€ν•©λ‹ˆλ‹€.